Telegram Group & Telegram Channel
πŸ› οΈ Π—Π°Π΄Π°Ρ‡Π° с ΠΏΠΎΠ΄Π²ΠΎΡ…ΠΎΠΌ: ЛСнивая инициализация ΠΈ Π»ΠΎΠ²ΡƒΡˆΠΊΠ° многопоточности

УсловиС:

Π£ вас Π΅ΡΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:


using System;
using System.Threading;

class Program
{
static Lazy<HeavyObject> _heavy = new Lazy<HeavyObject>(() =>
{
Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] Initializing HeavyObject...");
return new HeavyObject();
});

static void Main()
{
for (int i = 0; i < 5; i++)
{
new Thread(() =>
{
Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] Accessing HeavyObject...");
var obj = _heavy.Value;
}).Start();
}

Console.ReadLine();
}
}

class HeavyObject
{
public HeavyObject()
{
Thread.Sleep(1000); // эмуляция Π΄ΠΎΠ»Π³ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ
Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] HeavyObject created.");
}
}


❓ Вопрос:
Бколько Ρ€Π°Π· Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ сообщСниС Initializing HeavyObject... ΠΈ HeavyObject created.? ΠŸΠΎΡ‡Π΅ΠΌΡƒ это ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚ΡŒ Π΄Π°ΠΆΠ΅ ΠΎΠΏΡ‹Ρ‚Π½Ρ‹Ρ… .NET Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ²?

πŸ” Π Π°Π·Π±ΠΎΡ€:

На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд Π²Ρ‹ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ:

- `Lazy<T>` Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ **Π»Π΅Π½ΠΈΠ²ΡƒΡŽ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·** Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΌ доступС.
- Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ `Initializing HeavyObject...` ΠΈ конструктор `HeavyObject` ΡΡ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·.

Но! Π’ΡƒΡ‚ Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ΄Π²ΠΎΡ….

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `Lazy<T>` ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ **LazyThreadSafetyMode.ExecutionAndPublication**. Π­Ρ‚ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄Π°ΠΆΠ΅ Ссли нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ ΠΊ `.Value` ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ **Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·**.

βœ… **ΠžΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄:**

- ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΈΡˆΠ΅Ρ‚ `Accessing HeavyObject...`
- Волько ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΈΡˆΠ΅Ρ‚ `Initializing HeavyObject...` ΠΈ `HeavyObject created.`
- ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ доТдутся Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ ΡƒΠΆΠ΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄:

```
[4] Accessing HeavyObject...
[5] Accessing HeavyObject...
[6] Accessing HeavyObject...
[7] Accessing HeavyObject...
[8] Accessing HeavyObject...
[4] Initializing HeavyObject...
[4] HeavyObject created.
```

πŸŒ€ **ΠŸΠΎΠ΄Π²ΠΎΡ…, Ссли ΡΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ:**

Если Π²Ρ‹ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΊΠΎΠ΄ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

```csharp
static Lazy<HeavyObject> _heavy = new Lazy<HeavyObject>(
() =>
{
Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] Initializing HeavyObject...");
return new HeavyObject();
},
LazyThreadSafetyMode.None // Π±Π΅Π· потокобСзопасности
);
```

Π’ΠΎ ΠΏΡ€ΠΈ **ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΌ** доступС ΠΊ `.Value` Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ **нСсколько ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ** (ΠΏΠΎ сути Π³ΠΎΠ½ΠΊΡƒ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ:

```
[4] Accessing HeavyObject...
[5] Accessing HeavyObject...
[6] Accessing HeavyObject...
[4] Initializing HeavyObject...
[5] Initializing HeavyObject...
[6] Initializing HeavyObject...
[4] HeavyObject created.
[5] HeavyObject created.
[6] HeavyObject created.
```

Π˜Ρ‚ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ создан нСсколько Ρ€Π°Π·, Ρ‡Ρ‚ΠΎ Π»ΠΎΠΌΠ°Π΅Ρ‚ ΠΈΠ½Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ "Lazy Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·".

βœ… **Π’Ρ‹Π²ΠΎΠ΄:**

β€’ По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `Lazy<T>` **потокобСзопасСн**, Π½ΠΎ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ это ΠΌΠΎΠΆΠ½ΠΎ **ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ**.
β€’ ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ Π² .NET всСгда ΠΎΠ±Ρ€Π°Ρ‰Π°ΠΉΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° **Ρ€Π΅ΠΆΠΈΠΌ LazyThreadSafetyMode**.
β€’ Π”Π°ΠΆΠ΅ ΠΎΠΏΡ‹Ρ‚Π½Ρ‹Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π²ΠΎΡ…Π°, Ссли ΠΊΡ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎ ошибкС ΠΈΠ»ΠΈ ΠΈΠ· ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ `LazyThreadSafetyMode.None`.

πŸ’‘ **Бонус-вопрос:**
Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚, Ссли ваш factory-ΠΌΠ΅Ρ‚ΠΎΠ΄ (лямбда) выбросит ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ? Как `Lazy<T>` ΠΏΠΎΠ²Π΅Π΄Ρ‘Ρ‚ сСбя ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ доступС ΠΊ
.Value?

@csharp_ci



tg-me.com/csharp_ci/1366
Create:
Last Update:

πŸ› οΈ Π—Π°Π΄Π°Ρ‡Π° с ΠΏΠΎΠ΄Π²ΠΎΡ…ΠΎΠΌ: ЛСнивая инициализация ΠΈ Π»ΠΎΠ²ΡƒΡˆΠΊΠ° многопоточности

УсловиС:

Π£ вас Π΅ΡΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:


using System;
using System.Threading;

class Program
{
static Lazy<HeavyObject> _heavy = new Lazy<HeavyObject>(() =>
{
Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] Initializing HeavyObject...");
return new HeavyObject();
});

static void Main()
{
for (int i = 0; i < 5; i++)
{
new Thread(() =>
{
Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] Accessing HeavyObject...");
var obj = _heavy.Value;
}).Start();
}

Console.ReadLine();
}
}

class HeavyObject
{
public HeavyObject()
{
Thread.Sleep(1000); // эмуляция Π΄ΠΎΠ»Π³ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ
Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] HeavyObject created.");
}
}


❓ Вопрос:
Бколько Ρ€Π°Π· Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ сообщСниС Initializing HeavyObject... ΠΈ HeavyObject created.? ΠŸΠΎΡ‡Π΅ΠΌΡƒ это ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚ΡŒ Π΄Π°ΠΆΠ΅ ΠΎΠΏΡ‹Ρ‚Π½Ρ‹Ρ… .NET Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ²?

πŸ” Π Π°Π·Π±ΠΎΡ€:

На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд Π²Ρ‹ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ:

- `Lazy<T>` Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ **Π»Π΅Π½ΠΈΠ²ΡƒΡŽ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·** Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΌ доступС.
- Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ `Initializing HeavyObject...` ΠΈ конструктор `HeavyObject` ΡΡ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·.

Но! Π’ΡƒΡ‚ Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ΄Π²ΠΎΡ….

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `Lazy<T>` ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ **LazyThreadSafetyMode.ExecutionAndPublication**. Π­Ρ‚ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄Π°ΠΆΠ΅ Ссли нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ ΠΊ `.Value` ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ **Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·**.

βœ… **ΠžΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄:**

- ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΈΡˆΠ΅Ρ‚ `Accessing HeavyObject...`
- Волько ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΈΡˆΠ΅Ρ‚ `Initializing HeavyObject...` ΠΈ `HeavyObject created.`
- ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ доТдутся Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ ΡƒΠΆΠ΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄:

```
[4] Accessing HeavyObject...
[5] Accessing HeavyObject...
[6] Accessing HeavyObject...
[7] Accessing HeavyObject...
[8] Accessing HeavyObject...
[4] Initializing HeavyObject...
[4] HeavyObject created.
```

πŸŒ€ **ΠŸΠΎΠ΄Π²ΠΎΡ…, Ссли ΡΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ:**

Если Π²Ρ‹ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΊΠΎΠ΄ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

```csharp
static Lazy<HeavyObject> _heavy = new Lazy<HeavyObject>(
() =>
{
Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] Initializing HeavyObject...");
return new HeavyObject();
},
LazyThreadSafetyMode.None // Π±Π΅Π· потокобСзопасности
);
```

Π’ΠΎ ΠΏΡ€ΠΈ **ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΌ** доступС ΠΊ `.Value` Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ **нСсколько ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ** (ΠΏΠΎ сути Π³ΠΎΠ½ΠΊΡƒ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ:

```
[4] Accessing HeavyObject...
[5] Accessing HeavyObject...
[6] Accessing HeavyObject...
[4] Initializing HeavyObject...
[5] Initializing HeavyObject...
[6] Initializing HeavyObject...
[4] HeavyObject created.
[5] HeavyObject created.
[6] HeavyObject created.
```

Π˜Ρ‚ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ создан нСсколько Ρ€Π°Π·, Ρ‡Ρ‚ΠΎ Π»ΠΎΠΌΠ°Π΅Ρ‚ ΠΈΠ½Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ "Lazy Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·".

βœ… **Π’Ρ‹Π²ΠΎΠ΄:**

β€’ По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `Lazy<T>` **потокобСзопасСн**, Π½ΠΎ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ это ΠΌΠΎΠΆΠ½ΠΎ **ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ**.
β€’ ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ Π² .NET всСгда ΠΎΠ±Ρ€Π°Ρ‰Π°ΠΉΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° **Ρ€Π΅ΠΆΠΈΠΌ LazyThreadSafetyMode**.
β€’ Π”Π°ΠΆΠ΅ ΠΎΠΏΡ‹Ρ‚Π½Ρ‹Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π²ΠΎΡ…Π°, Ссли ΠΊΡ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎ ошибкС ΠΈΠ»ΠΈ ΠΈΠ· ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ `LazyThreadSafetyMode.None`.

πŸ’‘ **Бонус-вопрос:**
Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚, Ссли ваш factory-ΠΌΠ΅Ρ‚ΠΎΠ΄ (лямбда) выбросит ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ? Как `Lazy<T>` ΠΏΠΎΠ²Π΅Π΄Ρ‘Ρ‚ сСбя ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ доступС ΠΊ
.Value?

@csharp_ci

BY C# (C Sharp) programming


Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283

Share with your friend now:
tg-me.com/csharp_ci/1366

View MORE
Open in Telegram


C C Sharp programming Telegram | DID YOU KNOW?

Date: |

The STAR Market, as is implied by the name, is heavily geared toward smaller innovative tech companies, in particular those engaged in strategically important fields, such as biopharmaceuticals, 5G technology, semiconductors, and new energy. The STAR Market currently has 340 listed securities. The STAR Market is seen as important for China’s high-tech and emerging industries, providing a space for smaller companies to raise capital in China. This is especially significant for technology companies that may be viewed with suspicion on overseas stock exchanges.

How to Invest in Bitcoin?

Like a stock, you can buy and hold Bitcoin as an investment. You can even now do so in special retirement accounts called Bitcoin IRAs. No matter where you choose to hold your Bitcoin, people’s philosophies on how to invest it vary: Some buy and hold long term, some buy and aim to sell after a price rally, and others bet on its price decreasing. Bitcoin’s price over time has experienced big price swings, going as low as $5,165 and as high as $28,990 in 2020 alone. β€œI think in some places, people might be using Bitcoin to pay for things, but the truth is that it’s an asset that looks like it’s going to be increasing in value relatively quickly for some time,” Marquez says. β€œSo why would you sell something that’s going to be worth so much more next year than it is today? The majority of people that hold it are long-term investors.”

C C Sharp programming from fr


Telegram C# (C Sharp) programming
FROM USA